package com.z996.spring6.config;

import com.z996.spring6.pojo.User;
import org.springframework.beans.factory.FactoryBean;

/**
 * FactoryBean不是简单的Bean，而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似
 * Bean都是由BeanFactory（也就是IOC容器）来进行管理的
 * <p>
 * 作用:
 * 1.隐藏实例化比较复杂的bean
 * 在某些情况下，实例化Bean过程比较复杂，如果按照传统的方式，则需要在中提供大量的配置信息。配置方式的灵活性是受限的，这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口，用户可以通过实现该接口定制实例化Bean的逻辑。FactoryBean接口对于Spring框架来说占用重要的地位，Spring自身就提供了70多个FactoryBean的实现。它们隐藏了实例化一些复杂Bean的细节，给上层应用带来了便利。
 * 2. 第三方库注入问题
 * 由于第三方库不能直接注册到spring容器，于是可以实现org.springframework.bean.factory.FactoryBean接口，然后给出自己对象的实例化代码即可。
 */
public class UserFactoryBean implements FactoryBean<User> {
    @Override
    public User getObject() throws Exception {
        User user = new User();
        user.setId(100);
        user.setUsername("zfh");

        return user;
    }

    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
}